package com.sakura.system.service.impl.xyimpl;


import com.sakura.system.dao.xydao.MemberMapper;
import com.sakura.system.entity.xy.CinemaResult;
import com.sakura.system.entity.xy.Member;
import com.sakura.system.entity.xy.MemberQuery;
import com.sakura.system.entity.xy.PageResult;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Service
public class MemberServiceImpl implements MemberService {
    @Resource
    MemberMapper memberMapper;
    /**
     * 根据查询条件获取会员数据，如果提供了生日查询条件，则只返回当天生日的会员数据。
     *
     * @param query 会员查询条件，包含排序等信息。
     * @param birthdayQuery 生日查询条件，格式为"yyyy-MM-dd"，如果提供此条件，将只返回当天生日的会员。
     * @return CinemaResult 包含会员数据的查询结果，如果提供了生日查询条件，则返回当天生日的会员数据。
     */
    @Override
    public CinemaResult getMemberData(MemberQuery query, String birthdayQuery) {
        PageResult<Member> pageResult = new PageResult<>();

        // 根据查询条件查询会员信息
        List<Member> members = memberMapper.selectByOrder(query);
        List<Member> birthdayMembers = new ArrayList<>();

        // 设置查询结果列表
        pageResult.setList(members);

        // 如果提供了生日查询条件，筛选出当天生日的会员
        if(StringUtils.isNotBlank(birthdayQuery)){
            // 遍历所有会员，筛选出当天生日的会员
            for (Member member : members) {
                if (StringUtils.isNotBlank(member.getBirthday())) {
                    String[] birthdayParts = member.getBirthday().split("-");
                    // 提取月份和日期
                    String memberBirthday = birthdayParts[1] + "-" + birthdayParts[2];
                    // 当前日期的月份和日期
                    String currentBirthday = LocalDate.now().format(DateTimeFormatter.ofPattern("MM-dd"));

                    if (memberBirthday.equals(currentBirthday)) {
                        // 添加到当天生日会员列表
                        birthdayMembers.add(member);
                    }
                }
            }
            // 设置筛选后的当天生日会员数据
            pageResult.setList(birthdayMembers);
        }

        // 设置总记录数，用于分页
        pageResult.setPageTotal(memberMapper.selectCountByOrder(query));
        return CinemaResult.ok(pageResult);
    }


    /**
     * 成员注册
     * @param member 注册的成员对象，包含成员信息
     * @return CinemaResult 注册结果，包含注册成功的成员信息
     */
    @Override
    public CinemaResult memberRegister(Member member) {
        // 生成并设置成员的唯一标识符
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        member.setmemberId(uuid);
        // 将成员信息插入数据库
        memberMapper.insertMember(member);
        // 返回注册成功的成员信息
        return CinemaResult.ok(member);
    }

    /**
     * 删除会员
     * @param memberId 会员ID
     * @return CinemaResult 删除操作的结果，如果删除成功，返回一个成功的CinemaResult对象
     */
    @Override
    public CinemaResult delMember(String memberId) {
        // 删除指定ID的会员
        memberMapper.deleteMember(memberId);
        return CinemaResult.ok();
    }

    /**
     * 修改会员信息
     * @param member 会员对象，包含需要更新的会员信息
     * @return CinemaResult 返回操作结果，如果操作成功，则返回一个成功的CinemaResult对象
     */
    @Override
    public CinemaResult modifyMember(Member member) {
        // 更新数据库中的会员信息
        memberMapper.updateMember(member);
        return CinemaResult.ok();
    }

    /**
     * 获取会员数量。
     *
     * 本方法通过调用memberMapper中的selectCountByOrder方法，查询所有会员的数量。
     * 传入参数为null，表示查询所有会员。
     *
     * @return 返回会员数量，类型为Long。
     */
    @Override
    public Long getMemberNum() {
        // 查询会员数量
        return memberMapper.selectCountByOrder(null);
    }


    /**
     * 登录成员验证。
     *
     * @param member 包含登录成员信息的对象，如用户名和密码。
     * @return 返回匹配的成员对象，如果没有匹配则返回null。
     */
    @Override
    public Member loginMember(Member member) {
        // 通过成员的登录信息查询成员数据库
        return memberMapper.selectMemberByLogin(member);
    }
}
